package com.rabbitmq.rabbitmqdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 对于RabbitMQ来说,除了这三个基本模块以外,还添加了一个模块,即交换机(Exchange).
 * 它使得生产者和消息队列之间产生了隔离,生产者将消息发送给交换机,而交换机则根据调度策略把相应的消息转发给对应的消息队列.
 * 关于rabbitmq几个基础名词的介绍：
 *
 * Broker： 简单来说就是消息队列服务器实体。
 * Exchange： 消息交换机，它指定消息按什么规则，路由到哪个队列。
 * Queue： 消息队列载体，每个消息都会被投入到一个或多个队列。
 * Binding： 绑定，它的作用就是把exchange和queue按照路由规则绑定起来。
 * Routing Key： 路由关键字，exchange根据这个关键字进行消息投递。
 * vhost： 虚拟主机，一个broker里可以开设多个vhost，用作不同用户的权限分离。
 * producer： 消息生产者，就是投递消息的程序。
 * consumer： 消息消费者，就是接受消息的程序。
 * channel： 消息通道，在客户端的每个连接里，可建立多个channel，每个channel代表一个会话任务。
 * 交换机的主要作用是接收相应的消息并且绑定到指定的队列.交换机有四种类型,分别为Direct,topic,headers,Fanout：
 * Direct： 处理路由键。需要将一个队列绑定到交换机上，要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “demo”，则只有被标记为“demo”的消息才被转发，不会转发demo.ooo，也不会转发test.123，只会转发demo。
 * Topic： 转发信息主要是依据通配符,将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词，符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”，但是“audit.*” 只会匹配到“audit.irs”。
 * Headers： 根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中.
 * Fanout： 路由广播的形式,将会把消息发给绑定它的全部队列,即便设置了key,也会被忽略.
 */
@SpringBootApplication
public class RabbitmqDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqDemoApplication.class, args);
    }

}
